package main

import (
	"fmt"
	"time"
)

// 理念：不要通过共享内存来通信；通过通信来共享内存

/**
channel 例子四：

		因为 channel 一个协程发送数据，另一个协程就要接收数据！
		在这个过程中就要进行协程的切换比较费资源！
		另一个就是我channel发送后，就要等待被接收，比较麻烦！不接受就要出问题！

 */

// 可以使用一个缓冲区的channel
// 会有性能提升
func bufferedChannel()  {
	// 创建一个带有缓冲区的 channel，缓冲区大小为 3
	// 表示只能放 3 个数据的缓冲
	c := make(chan int, 3)

	// 接收者
	go worker4(0, c)

	c <- 'a'
	c <- 'b'
	c <- 'c'
	c <- 'd'

	time.Sleep(time.Millisecond)
}

// 关闭channel 例子
func channelClose (){

	// 创建一个带有缓冲区的 channel，缓冲区大小为 3
	// 表示只能放 3 个数据的缓冲
	c := make(chan int, 3)

	// 接收者
	go worker4(0, c)

	c <- 'a'
	c <- 'b'
	c <- 'c'
	c <- 'd'

	// 我发送方，告诉接收方，我发送数据完毕了，可以关闭了
	// 调用 close(c) 表示关闭，关闭的标记值是 0
	close(c)

	time.Sleep(time.Millisecond)

}

func worker4(id int, c chan int)  {
	for {
		// 这种方式接收，n 表示接收到的值，ok 表式是否还有数据可以接收
		n, ok := <-c
		if !ok {
			// 表示结束这个 接收的 协程
			break
		}
		fmt.Printf("接收到的值: %d\n", n)
	}

	// 这个方式也可以，等到我接收完毕，我就跳出去
	// 但这个方式，只要是 发送方没有 close(c) ,就不算结束，只是我这个 for 循环自己跳出了而已
	// 然后等到我这个 main 主函数结束后，我发送方的 协程才算结束
	//for n := range c{
	//	fmt.Printf("接收到的值: %d\n", n)
	//}

}


func main() {
	
}
